package com.example.myyunpan.component;

import com.example.myyunpan.entity.constants.Constants;
import com.example.myyunpan.entity.domain.UserInfo;
import com.example.myyunpan.entity.dto.DownloadFileDto;
import com.example.myyunpan.entity.dto.SysSettingsDto;
import com.example.myyunpan.entity.dto.UserSpaceDto;
import com.example.myyunpan.mapper.FileInfoMapper;
import com.example.myyunpan.mapper.UserInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
public class RedisComponent {

    @Resource
    private RedisUtils redisUtils;

    @Autowired
    private FileInfoMapper fileInfoMapper;

    @Autowired
    private UserInfoMapper userInfoMapper;

    /**
     * @return com.example.myyunpan.entity.dto.SysSettingsDto
     * @param @param
     * @author znk
     * @date 2024/10/25 18:29
     * TODO 疑问？
     */
    public SysSettingsDto getSysSettings(String code) {
        SysSettingsDto sysSettingsDto=(SysSettingsDto)redisUtils.get(Constants.REDIS_KEY_SYS_SETTING);
        if(sysSettingsDto==null){
            sysSettingsDto=new SysSettingsDto();
            sysSettingsDto.setRandomNumber(code);
            redisUtils.setex(Constants.REDIS_KEY_SYS_SETTING,sysSettingsDto,Constants.REDIS_KEY_EXPIRES_ONE_MIN);
        }
        return sysSettingsDto;
    }

    /**
     * @return com.example.myyunpan.entity.dto.SysSettingsDto
     * @param @param
     * @author znk
     * @date 2024/10/26 17:04
     * 重载方法，用于在登录时获取，用户系统参数
     */
    public SysSettingsDto getSysSettings() {
        SysSettingsDto sysSettingsDto=(SysSettingsDto)redisUtils.get(Constants.REDIS_KEY_SYS_SETTING);
        if(sysSettingsDto==null){
            sysSettingsDto=new SysSettingsDto();
            redisUtils.setex(Constants.REDIS_KEY_SYS_SETTING,sysSettingsDto,Constants.REDIS_KEY_EXPIRES_ONE_MIN);
        }
        return sysSettingsDto;
    }

    /**
     * @return void
     * @param @param userId
    	* @param userSpaceDto
     * @author znk
     * @date 2024/10/26 17:52
     * 用户空间的使用情况（总空间和已经使用的空间），redis中记录
     */
    public void saveUserSpaceUser(String userId, UserSpaceDto userSpaceDto) {
        redisUtils.setex(Constants.REDIS_KEY_USER_SPACE_USE+userId,userSpaceDto,Constants.REDIS_KEY_EXPIRES_DAY);

    }




    public Object getUserSpaceUser(String userId) {
        UserSpaceDto userSpaceDto= (UserSpaceDto) redisUtils.get(Constants.REDIS_KEY_USER_SPACE_USE+userId);
        if(userSpaceDto==null){
            userSpaceDto=new UserSpaceDto();
            Long useSpace  = fileInfoMapper.selectUseSpaceByUserId(userId);
            userSpaceDto.setUseSpace(useSpace);
            userSpaceDto.setTotalSpace(getSysSettings().getUserInitUseSpace()* Constants.MB);
            saveUserSpaceUser(userId,userSpaceDto);
        }
        return userSpaceDto;
    }

    /**
     * 更新和保持临时文件夹的大小，将原先的临时文件夹的大小加上传进来的文件的大小
     * @param userId
     * @param fileId
     * @param fileSize
     */
    public void saveFileTempSize(String userId, String fileId, Long fileSize) {
        Long currentSize = getFileTempSize(userId, fileId);
        redisUtils.setex(Constants.REDIS_KEY_USER_FILE_TEMP_SIZE + userId + fileId, currentSize + fileSize, Constants.REDIS_KEY_EXPIRES_ONE_HOUR);
    }

    /**
     * 获取临时文件夹的大小
     * @param userId
     * @param fileId
     * @return
     */
    public Long getFileTempSize(String userId, String fileId) {
        Long currentSize = getFileSizeFromRedis(Constants.REDIS_KEY_USER_FILE_TEMP_SIZE + userId + fileId);
        return currentSize;
    }

    /*
    * 根据key获取大小
    * */
    private Long getFileSizeFromRedis(String key) {
        Object sizeObj = redisUtils.get(key);
        if (sizeObj == null) {
            return 0L;
        }
        if (sizeObj instanceof Integer) {
            return ((Integer) sizeObj).longValue();
        } else if (sizeObj instanceof Long) {
            return (Long) sizeObj;
        }

        return 0L;
    }

    public void saveDownloadCode(String code, DownloadFileDto downloadFileDto) {
        redisUtils.setex(Constants.REDIS_KEY_DOWNLOAD+code,downloadFileDto,Constants.REDIS_KEY_EXPIRES_FIVE_MIN);
    }

    public DownloadFileDto getDownloadCode(String code) {
        DownloadFileDto downloadFileDto =(DownloadFileDto) redisUtils.get(Constants.REDIS_KEY_DOWNLOAD + code);
        return downloadFileDto;
    }

    public void saveSysettings(SysSettingsDto sysSettingsDto) {
        redisUtils.set(Constants.REDIS_KEY_SYS_SETTING,sysSettingsDto);
    }

    public UserSpaceDto resetUserSpaceUser(String userId) {
        UserSpaceDto spaceDto = new UserSpaceDto();
        Long useSpace = this.fileInfoMapper.selectUseSpaceByUserId(userId);
        spaceDto.setUseSpace(useSpace);

        UserInfo userInfo = userInfoMapper.selectById(userId);
        spaceDto.setTotalSpace(userInfo.getTotalSpace());
        redisUtils.setex(Constants.REDIS_KEY_USER_SPACE_USE + userId, spaceDto, Constants.REDIS_KEY_EXPIRES_DAY);
        return spaceDto;
    }
}
